package com.textcheck;

/**
 * 连续字符相似度计算器
 * 
 * 该实现通过检测两个文本中连续15个及以上相同字符来计算相似度。
 * 计算方式：
 * 1. 找出所有长度大于等于15的公共子串
 * 2. 计算所有匹配子串的总长度
 * 3. 相似度 = 匹配字符总长度 / min(text1长度, text2长度)
 */
public class ConsecutiveSimilarity implements SimilarityCalculator {
    
    private static final int MIN_LENGTH = 15; // 最小连续匹配长度
    
    @Override
    public double calculate(String text1, String text2) {
        // 处理特殊情况
        if (text1 == null || text2 == null) {
            return 0.0;
        }
        if (text1.isEmpty() && text2.isEmpty()) {
            return 1.0;
        }
        if (text1.isEmpty() || text2.isEmpty()) {
            return 0.0;
        }

        int minLength = Math.min(text1.length(), text2.length());
        int totalMatchLength = 0;

        // 使用动态规划查找所有连续匹配
        int[][] dp = new int[text1.length() + 1][text2.length() + 1];
        
        // 找出所有长度大于等于MIN_LENGTH的连续匹配
        for (int i = 1; i <= text1.length(); i++) {
            for (int j = 1; j <= text2.length(); j++) {
                if (text1.charAt(i - 1) == text2.charAt(j - 1)) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                    
                    // 当找到一个满足长度要求的匹配时
                    if (dp[i][j] >= MIN_LENGTH) {
                        // 只计算刚好达到要求的匹配
                        if (i == text1.length() || j == text2.length() || 
                            text1.charAt(i) != text2.charAt(j)) {
                            totalMatchLength += dp[i][j];
                        }
                    }
                } else {
                    dp[i][j] = 0; // 重置连续计数
                }
            }
        }

        // 计算相似度
        return (double) totalMatchLength / minLength;
    }
}